package cube.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import cube.data.util.DataUtil;

/**
 * TimeUtil
 * 
 * @author abiao
 */
public class TimeUtil {

    /**
     * 定义日期默认格式
     */
    private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
    private static final String SQL_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private static final SimpleDateFormat DEFAULT_TIME_FORMAT = new SimpleDateFormat(DEFAULT_FORMAT);

    /**
     * 阻塞周期时间
     */
    private static final int BLOCK_PERIOD = 10;

    /**
     * 以默认格式显示当前时间
     */
    public static String getNowTime() {
        return getTime(new Date());
    }

    /**
     * 以自定义格式显示当前时间
     */
    public static String getNowTime(String format) {
        return getTime(new Date(), format);
    }

    /**
     * 以默认格式显示传入时间
     */
    public static String getTime(Date date) {
        return DEFAULT_TIME_FORMAT.format(date);
    }

    /**
     * 以自定义格式显示传入时间
     */
    public static String getTime(Date date, String format) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 将数据库Date转换为字符串表示
     */
    public static String getSQLTime(Date date) {
        return getTime(date, SQL_TIME_FORMAT);
    }

    /**
     * 将数据库时间字符串转换为Date表示
     */
    public static Date getSQLDate(String sqlTime) {
        if(sqlTime == null){
            
        }
        return getDate(sqlTime, SQL_TIME_FORMAT);
    }

    /**
     * 自定义格式时间转Date日期
     */
    public static Date getDate(String time, String format) {
        Date date = null;
        try {
            date = new SimpleDateFormat(format).parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 根据参数获取日期
     */
    public static Date getDate(int y, int m, int d) {
        return getDate(y, m, d, 0, 0, 0);
    }

    /**
     * 根据参数获取日期
     */
    public static Date getDate(int y, int m, int d, int h, int M, int s) {
        return getDate(y, m, d, h, M, s, 0);
    }

    /**
     * 根据参数获取日期
     */
    public static Date getDate(int y, int m, int d, int h, int M, int s, int ms) {
        return getDate(y + "-" + getDateParam(m, 2) + "-" + getDateParam(d, 2) + " " + getDateParam(h, 2) + ":"
                + getDateParam(M, 2) + ":" + getDateParam(s, 2) + "." + getDateParam(ms, 3), DEFAULT_FORMAT);
    }

    /**
     * 转换为指定长度时间参数
     */
    private static String getDateParam(int p, int len) {
        if (String.valueOf(p).length() < len) {
            return StringUtil.addOccupy('0', String.valueOf(p), len);
        }
        return String.valueOf(p);
    }

    /**
     * 休眠一段时间
     */
    public static void sleep(int ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 阻塞一个非常短的周期
     */
    public static void blockPeriod() {
        TimeUtil.sleep(BLOCK_PERIOD);
    }

    /**
     * 获取当前时间毫秒数
     */
    public static long getTime() {
        return new Date().getTime();
    }

    /**
     * 阻塞
     */
    public static void wait(Object o) {
        try {
            o.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 超时阻塞
     */
    public static void wait(Object o, int timeout) {
        try {
            o.wait(timeout);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 唤醒所有等待的线程
     */
    public static void notifyAll(Object o) {
        o.notifyAll();
    }

    /**
     * 生成随机时间
     */
    public static Date random(Date begin, Date end) {
        return new Date(DataUtil.random(begin.getTime(), end.getTime()));
    }
}
